这段代码来自libHaru库，该库用于生成PDF文件。下面是对各个函数的详细解释：

1. **HPDF_Binary_New**: 这个函数创建一个新的二进制对象（HPDF_Binary）。它首先分配内存空间给HPDF_Binary_Rec结构体，然后初始化结构体内的成员，包括设置对象类为HPDF_OCLASS_BINARY，初始化管理器(mmgr)、错误处理(error)等字段，并调用`HPDF_Binary_SetValue`函数设置二进制对象的值。

2. **HPDF_Binary_Write**: 该函数用于将HPDF_Binary对象的内容写入到HPDF_Stream中，这是PDF文件的一部分。如果二进制对象的长度为0，则写入一个空的<>符号表示空的二进制数据；否则，它会先写入<字符，如果提供了加密对象(e)，则使用该加密对象对数据进行加密重置，随后将二进制数据写入流，最后写入>字符结束。

3. **HPDF_Binary_SetValue**: 设置HPDF_Binary对象的值。首先检查传入的二进制数据长度是否超过限制，如果超过则返回错误。接着，如果当前二进制对象已有值，会先释放已有的内存。然后，分配与传入数据长度相等的内存空间，将数据复制到新分配的内存中，并更新对象的长度。

4. **HPDF_Binary_Free**: 释放HPDF_Binary对象占用的资源，包括二进制数据的内存以及对象本身的内存。

5. **HPDF_Binary_GetLen**: 返回HPDF_Binary对象中二进制数据的长度。

6. **HPDF_Binary_GetValue**: 返回指向HPDF_Binary对象中二进制数据的指针。

这些函数共同提供了libHaru库中处理PDF文件中二进制数据的能力，使得开发者能够方便地创建、操作和写入二进制数据到PDF文档中。/*
 * << Haru Free PDF Library >> -- hpdf_binary.c
 *
 * URL: http://libharu.org
 *
 * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
 * Copyright (c) 2007-2009 Antony Dovgal <tony@daylessday.org>
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.
 * It is provided "as is" without express or implied warranty.
 *
 */

#include "hpdf_conf.h"
#include "hpdf_utils.h"
#include "hpdf_objects.h"


HPDF_Binary
HPDF_Binary_New  (HPDF_MMgr  mmgr,
                  HPDF_BYTE  *value,
                  HPDF_UINT  len)
{
    HPDF_Binary obj;

    obj  = HPDF_GetMem (mmgr, sizeof(HPDF_Binary_Rec));

    if (obj) {
        HPDF_MemSet(&obj->header, 0, sizeof(HPDF_Obj_Header));
        obj->header.obj_class = HPDF_OCLASS_BINARY;

        obj->mmgr = mmgr;
        obj->error = mmgr->error;
        obj->value = NULL;
        obj->len = 0;
        if (HPDF_Binary_SetValue (obj, value, len) != HPDF_OK) {
            HPDF_FreeMem (mmgr, obj);
            return NULL;
        }
    }

    return obj;
}

HPDF_STATUS
HPDF_Binary_Write  (HPDF_Binary   obj,
                    HPDF_Stream   stream,
                    HPDF_Encrypt  e)
{
    HPDF_STATUS ret;

    if (obj->len == 0)
        return HPDF_Stream_WriteStr (stream, "<>");

    if ((ret = HPDF_Stream_WriteChar (stream, '<')) != HPDF_OK)
        return ret;

    if (e)
        HPDF_Encrypt_Reset (e);

    if ((ret = HPDF_Stream_WriteBinary (stream, obj->value, obj->len, e)) !=
                    HPDF_OK)
        return ret;

    return HPDF_Stream_WriteChar (stream, '>');
}


HPDF_STATUS
HPDF_Binary_SetValue  (HPDF_Binary  obj,
                       HPDF_BYTE    *value,
                       HPDF_UINT    len)
{
    if (len > HPDF_LIMIT_MAX_STRING_LEN)
        return HPDF_SetError (obj->error, HPDF_BINARY_LENGTH_ERR, 0);

    if (obj->value) {
        HPDF_FreeMem (obj->mmgr, obj->value);
        obj->len = 0;
    }

    obj->value = HPDF_GetMem (obj->mmgr, len);
    if (!obj->value)
        return HPDF_Error_GetCode (obj->error);

    HPDF_MemCpy (obj->value, value, len);
    obj->len = len;

    return HPDF_OK;
}


void
HPDF_Binary_Free  (HPDF_Binary  obj)
{
    if (!obj)
        return;

    if (obj->value)
        HPDF_FreeMem (obj->mmgr, obj->value);

    HPDF_FreeMem (obj->mmgr, obj);
}

HPDF_UINT
HPDF_Binary_GetLen  (HPDF_Binary  obj)
{
    return obj->len;
}

HPDF_BYTE*
HPDF_Binary_GetValue  (HPDF_Binary  obj)
{
    return obj->value;
}

